package com.hfb.mashibing.alip8.juc.c020_01_interview.A1B2C3;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;


/**
 *  互联网一线大厂面试题：
 *      徒手写出：2个不同的线程，交替输出A1B2C3。。。
 *
 * 线程排序问题
 * 思路：
 *  * 描述: TransferQueue的作用
 *  * 就相当于生产者消费者模式，将一个对象transfer进队列中，即生产，等待别的线程来消费该对象
 *  * take()用来消费，当队列中没有对象时，相当于没有产品，得等待生产者生产产品以供消费者消费，
 *  * 即这里的用两个线程相互打印对方的信息
 */

public class A1B2C3TransferQueue {

    private static char[] charsLetter = "ABCDEFGHI".toCharArray();
    private static char[] charsNumber = "123456789".toCharArray();

    static TransferQueue transferQueue = new LinkedTransferQueue();

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        new Thread(()->{
            for (int i = 0; i < charsLetter.length; i++) {
                try {
                    // 生产字母
                    transferQueue.transfer(charsLetter[i]);

                    // 消费数字
                    System.out.print(transferQueue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println();
        }).start();
        new Thread(()->{
            for (int i = 0; i < charsNumber.length; i++) {
                try {
                    // 消费字母
                    System.out.print(transferQueue.take());

                    // 生产数字
                    transferQueue.transfer(charsNumber[i]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }

}
